• Jump To … +
    zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.js zoo_frontend/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.min.js zoo_frontend/node_modules/hoist-non-react-statics/src/index.js zoo_frontend/pages/_app.jsx zoo_frontend/pages/_document.jsx zoo_frontend/pages/admin/delivery-containers/index.js zoo_frontend/pages/admin/department/index.js zoo_frontend/pages/admin/group-diets/index.js zoo_frontend/pages/admin/species/index.js zoo_frontend/pages/admin/user/index.js zoo_frontend/pages/diet/edit.js zoo_frontend/pages/diet/index.js zoo_frontend/pages/diet/new.js zoo_frontend/pages/food/dataSrc.js zoo_frontend/pages/food/edit.js zoo_frontend/pages/food/index.js zoo_frontend/pages/food/new.js zoo_frontend/pages/food/nicknames.js zoo_frontend/pages/food/nutrDef.js zoo_frontend/pages/food/units.js zoo_frontend/pages/home/index.js zoo_frontend/pages/index.jsx zoo_frontend/pages/kitchen/index.js zoo_frontend/pages/kitchen/prep/index.js zoo_frontend/pages/login/index.js zoo_frontend/pages/nutritionist/index.js zoo_frontend/pages/print/bin-label.js zoo_frontend/pages/print/index.js zoo_frontend/pages/print/labels.js zoo_frontend/pages/print/prep-sheet.js zoo_frontend/pages/profile/index.js zoo_frontend/pages/reports/cost-by-gl-code.js zoo_frontend/pages/reports/dept-cards.js zoo_frontend/pages/reports/dept-keeper-cards.js zoo_frontend/pages/reports/feeding-cost.js zoo_frontend/pages/reports/index.js zoo_frontend/pages/reports/prep-cards-table.js zoo_frontend/src/api/Animals.js zoo_frontend/src/api/Api.js zoo_frontend/src/api/BudgetIds.js zoo_frontend/src/api/CaseNotes.js zoo_frontend/src/api/DataSrc.js zoo_frontend/src/api/DeliveryContainers.js zoo_frontend/src/api/Departments.js zoo_frontend/src/api/DietChanges.js zoo_frontend/src/api/DietHistory.js zoo_frontend/src/api/DietPlans.js zoo_frontend/src/api/Diets.js zoo_frontend/src/api/Food.js zoo_frontend/src/api/FoodCategories.js zoo_frontend/src/api/FoodPrepTables.js zoo_frontend/src/api/FoodWeights.js zoo_frontend/src/api/LifeStages.js zoo_frontend/src/api/Locations.js zoo_frontend/src/api/NutData.js zoo_frontend/src/api/NutrDef.js zoo_frontend/src/api/PrepNotes.js zoo_frontend/src/api/RoleMappings.js zoo_frontend/src/api/Roles.js zoo_frontend/src/api/Species.js zoo_frontend/src/api/Subenclosures.js zoo_frontend/src/api/Units.js zoo_frontend/src/api/Users.js zoo_frontend/src/api/index.js zoo_frontend/src/components/ConfirmationDialog.jsx zoo_frontend/src/components/ErrorPage.jsx zoo_frontend/src/components/FormCheckbox.jsx zoo_frontend/src/components/Header.jsx zoo_frontend/src/components/KitchenView.jsx zoo_frontend/src/components/Notifications.jsx zoo_frontend/src/components/PrintPrepSheets/PrepSheetPrintOut.jsx zoo_frontend/src/components/PrintPrepSheets/PrintPrepSheets.jsx zoo_frontend/src/components/PrintPrepSheets/index.js zoo_frontend/src/components/ReactSingleSelect.jsx zoo_frontend/src/components/SidebarDrawer.jsx zoo_frontend/src/components/VirtualTable.jsx zoo_frontend/src/components/index.js zoo_frontend/src/getPageContext.js zoo_frontend/src/pages/PageAccess.js zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.jsx zoo_frontend/src/pages/admin/deliveryContainers/deliveryContainers.styles.js zoo_frontend/src/pages/admin/deliveryContainers/index.js zoo_frontend/src/pages/admin/department/department.jsx zoo_frontend/src/pages/admin/department/department.styles.js zoo_frontend/src/pages/admin/department/index.js zoo_frontend/src/pages/admin/groupDiets/groupDiets.jsx zoo_frontend/src/pages/admin/groupDiets/groupDiets.styles.js zoo_frontend/src/pages/admin/groupDiets/index.js zoo_frontend/src/pages/admin/species/index.js zoo_frontend/src/pages/admin/species/species.jsx zoo_frontend/src/pages/admin/species/species.styles.js zoo_frontend/src/pages/admin/user/index.js zoo_frontend/src/pages/admin/user/user.jsx zoo_frontend/src/pages/admin/user/user.styles.js zoo_frontend/src/pages/diet/CaseNotesForm.jsx zoo_frontend/src/pages/diet/CurrentDiet.jsx zoo_frontend/src/pages/diet/DietChangeCard.jsx zoo_frontend/src/pages/diet/DietHistory.jsx zoo_frontend/src/pages/diet/DietPlanChangeDialog.jsx zoo_frontend/src/pages/diet/DietSelectDialog.jsx zoo_frontend/src/pages/diet/diet.jsx zoo_frontend/src/pages/diet/diet.styles.js zoo_frontend/src/pages/diet/dietForm.jsx zoo_frontend/src/pages/diet/dietHistoryList.jsx zoo_frontend/src/pages/diet/edit/edit.jsx zoo_frontend/src/pages/diet/edit/edit.styles.js zoo_frontend/src/pages/diet/edit/index.js zoo_frontend/src/pages/diet/index.js zoo_frontend/src/pages/diet/new/index.js zoo_frontend/src/pages/diet/new/new.jsx zoo_frontend/src/pages/diet/new/new.styles.js zoo_frontend/src/pages/diet/prepNotesForm.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.jsx zoo_frontend/src/pages/food/dataSrc/dataSrc.styles.js zoo_frontend/src/pages/food/dataSrc/index.js zoo_frontend/src/pages/food/edit/FoodWeightTable.jsx zoo_frontend/src/pages/food/edit/edit.jsx zoo_frontend/src/pages/food/edit/edit.styles.js zoo_frontend/src/pages/food/edit/index.js zoo_frontend/src/pages/food/food.jsx zoo_frontend/src/pages/food/food.styles.js zoo_frontend/src/pages/food/foodForm.jsx zoo_frontend/src/pages/food/index.js zoo_frontend/src/pages/food/new/index.js zoo_frontend/src/pages/food/new/new.jsx zoo_frontend/src/pages/food/new/new.styles.js zoo_frontend/src/pages/food/nicknames/index.js zoo_frontend/src/pages/food/nicknames/nicknames.jsx zoo_frontend/src/pages/food/nicknames/nicknames.styles.js zoo_frontend/src/pages/food/nutrDef/index.js zoo_frontend/src/pages/food/nutrDef/nutrDef.jsx zoo_frontend/src/pages/food/nutrDef/nutrDef.styles.js zoo_frontend/src/pages/food/units/index.js zoo_frontend/src/pages/food/units/units.jsx zoo_frontend/src/pages/food/units/units.styles.js zoo_frontend/src/pages/home/home.jsx zoo_frontend/src/pages/home/home.styles.js zoo_frontend/src/pages/home/index.js zoo_frontend/src/pages/kitchen/index.js zoo_frontend/src/pages/kitchen/kitchenHome.jsx zoo_frontend/src/pages/kitchen/kitchenHome.styles.js zoo_frontend/src/pages/kitchen/prep/index.js zoo_frontend/src/pages/kitchen/prep/kitchen.jsx zoo_frontend/src/pages/kitchen/prep/kitchen.styles.js zoo_frontend/src/pages/login/index.js zoo_frontend/src/pages/login/login.jsx zoo_frontend/src/pages/login/login.styles.js zoo_frontend/src/pages/nutritionist/admin.jsx zoo_frontend/src/pages/nutritionist/admin.styles.js zoo_frontend/src/pages/nutritionist/index.js zoo_frontend/src/pages/print/admin.jsx zoo_frontend/src/pages/print/admin.styles.js zoo_frontend/src/pages/print/bin-label/admin.jsx zoo_frontend/src/pages/print/bin-label/admin.styles.js zoo_frontend/src/pages/print/bin-label/index.js zoo_frontend/src/pages/print/index.js zoo_frontend/src/pages/print/labels/admin.jsx zoo_frontend/src/pages/print/labels/admin.styles.js zoo_frontend/src/pages/print/labels/index.js zoo_frontend/src/pages/print/prep-sheet/admin.jsx zoo_frontend/src/pages/print/prep-sheet/admin.styles.js zoo_frontend/src/pages/print/prep-sheet/index.js zoo_frontend/src/pages/profile/index.js zoo_frontend/src/pages/profile/profile.jsx zoo_frontend/src/pages/profile/profile.styles.js zoo_frontend/src/pages/reports/admin.jsx zoo_frontend/src/pages/reports/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/admin.jsx zoo_frontend/src/pages/reports/cost-by-gl-code/admin.styles.js zoo_frontend/src/pages/reports/cost-by-gl-code/index.js zoo_frontend/src/pages/reports/dept-cards/admin.jsx zoo_frontend/src/pages/reports/dept-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-cards/index.js zoo_frontend/src/pages/reports/dept-keeper-cards/admin.jsx zoo_frontend/src/pages/reports/dept-keeper-cards/admin.styles.js zoo_frontend/src/pages/reports/dept-keeper-cards/index.js zoo_frontend/src/pages/reports/feeding-cost/admin.jsx zoo_frontend/src/pages/reports/feeding-cost/admin.styles.js zoo_frontend/src/pages/reports/feeding-cost/index.js zoo_frontend/src/pages/reports/index.js zoo_frontend/src/pages/reports/prep-cards-table/admin.jsx zoo_frontend/src/pages/reports/prep-cards-table/admin.styles.js zoo_frontend/src/pages/reports/prep-cards-table/index.js zoo_frontend/src/static/LocalStorage.js zoo_frontend/src/static/Roles.js zoo_frontend/src/util/AuthProvider.jsx zoo_frontend/src/util/PageLayout.jsx zoo_frontend/src/util/TableColumnHelper.js zoo_frontend/src/util/WithPropsChecker.jsx zoo_frontend/src/util/camelToNorm.js zoo_frontend/src/util/withAuth.jsx
  • dietForm.jsx

  • ¶
    /* eslint-disable react/jsx-no-bind */
    import React, { Fragment } from 'react';
    import Button from '@material-ui/core/Button';
    import TextField from '@material-ui/core/TextField';
    import { Grid, LinearProgress } from '@material-ui/core';
    import PropTypes from 'prop-types';
    import { withFormik, Field } from 'formik';
    import Select from 'react-select';
    import * as Yup from 'yup';
    
    import { FormCheckbox, SingleSelect } from '../../components';
    
    export const DisplayFormikState = props => (
      <div style={{ margin: '1rem 0' }}>
        <pre
          style={{
            background: '#f6f8fa',
            fontSize: '.65rem',
            padding: '.5rem',
          }}
        >
          <strong>props</strong> ={' '}
          {JSON.stringify(props, null, 2)}
        </pre>
      </div>
    );
    
    const formikEnhancer = withFormik({
      enableReinitialize: true,
      validationSchema: Yup.object().shape({
        speciesId: Yup.string().required('Species is required'),
        current: Yup.bool(),
        tableId: Yup.string().required('Table is Required'),
        noteId: Yup.string().required('Diet name is required'),
        label: Yup.bool(),
        dcId: Yup.string().required('Delivery Container is required'),
        ncPrepares: Yup.bool(),
        groupId: Yup.string().required('Group Diet is required, if no group diet. set to "NONE"'),
        analyzed: Yup.bool(),
      }),
      mapPropsToValues: props => ({
        speciesId: props.speciesId ? String(props.speciesId) : '',
        current: props.current ? props.current === 1 : true, // default true
        tableId: props.tableId ? String(props.tableId) : '',
        noteId: props.noteId ? props.noteId : '',
        label: props.label ? props.label === 1 : true, // default true
        dcId: props.dcId ? String(props.dcId) : '',
        ncPrepares: props.ncPrepares ? props.ncPrepares === 1 : true, // default true
        groupId: props.groupId ? String(props.groupId) : '1',
        analyzed: props.analyzed === 1,
        submitForm: props.submitForm, // jank way to send in the function
      }),
      handleSubmit: (values, { setSubmitting }) => {
        const {
          current, label, ncPrepares, analyzed, submitForm, ...rest
        } = values;
        const payload = {
          current: current ? 1 : 0,
          label: label ? 1 : 0,
          ncPrepares: ncPrepares ? 1 : 0,
          analyzed: analyzed ? 1 : 0,
          ...rest,
        };
        submitForm(payload).then(() => {
          setSubmitting(false);
        }, () => {
          setSubmitting(false);
        });
      },
      displayName: 'MyForm',
    });
    
    
    const Form = props => {
      const {
        values: {
          speciesId,
          current,
          tableId,
          noteId,
          label,
          dcId,
          ncPrepares,
          groupId,
          analyzed,
        },
        errors,
        touched,
        handleChange,
        isValid,
        setFieldTouched,
        isSubmitting,
      } = props;
    
      const change = (name, e) => {
        e.persist();
        handleChange(e);
        setFieldTouched(name, true, false);
      };
  • ¶

    const { // DEBUG FORMIK STATE groupDietCodes, deliveryContainerCodes, tableCodes, speciesCodes, …debug } = props;

      return (
        <form
          onSubmit={(e) => {
            e.preventDefault();
            props.handleSubmit(e);
          }}
        >
          <Grid container>
            <Grid item xs={12} sm={4} container>
              <Grid item xs={12}>
                <Field
                  name="speciesId"
                  label="Species ID"
                  component={SingleSelect}
                  suggestions={props.speciesCodes}
                  value={speciesId}
                  error={touched.speciesId && Boolean(errors.speciesId)}
                  helperText={touched.speciesId ? errors.speciesId : ''}
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <TextField
                  id="noteId"
                  name="noteId"
                  helperText={touched.noteId ? errors.noteId : ''}
                  error={touched.noteId && Boolean(errors.noteId)}
                  label="Description"
                  value={noteId}
                  onChange={change.bind(null, 'noteId')}
                  variant="outlined"
                  fullWidth
                  onFocus={change.bind(null, 'noteId')}
                  disabled={props.editDisabled}
                />
              </Grid>
            </Grid>
            <Grid item xs={12} sm={4} container>
              <Grid item xs={12}>
                <FormCheckbox
                  id="current"
                  name="current"
                  helperText={touched.current ? errors.current : ''}
                  error={touched.current && Boolean(errors.current)}
                  label="Current Diet"
                  value={current}
                  onChange={(e) => {
                    e.target.value = e.target.checked;
                    change.bind(null, 'current')(e);
                  }}
                  variant="outlined"
                  fullWidth
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <FormCheckbox
                  id="ncPrepares"
                  name="ncPrepares"
                  helperText={touched.ncPrepares ? errors.ncPrepares : ''}
                  error={touched.ncPrepares && Boolean(errors.ncPrepares)}
                  label="DK Prepares"
                  value={ncPrepares}
                  onChange={(e) => {
                    e.target.value = e.target.checked;
                    change.bind(null, 'ncPrepares')(e);
                  }}
                  variant="outlined"
                  fullWidth
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <FormCheckbox
                  id="label"
                  name="label"
                  helperText={touched.label ? errors.label : ''}
                  error={touched.label && Boolean(errors.label)}
                  label="Sticker"
                  value={label}
                  onChange={(e) => {
                    e.target.value = e.target.checked;
                    change.bind(null, 'label')(e);
                  }}
                  variant="outlined"
                  fullWidth
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <FormCheckbox
                  id="analyzed"
                  name="analyzed"
                  helperText={touched.analyzed ? errors.analyzed : ''}
                  error={touched.analyzed && Boolean(errors.analyzed)}
                  label="Diet Analyzed"
                  value={analyzed}
                  onChange={(e) => {
                    e.target.value = e.target.checked;
                    change.bind(null, 'analyzed')(e);
                  }}
                  variant="outlined"
                  fullWidth
                  disabled={props.editDisabled}
                />
              </Grid>
            </Grid>
            <Grid item xs={12} sm={4} container>
              <Grid item xs={12}>
                <Field
                  name="tableId"
                  label="Prep Location"
                  component={SingleSelect}
                  suggestions={props.tableCodes}
                  value={tableId}
                  error={touched.tableId && Boolean(errors.tableId)}
                  helperText={touched.tableId ? errors.tableId : ''}
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <Field
                  name="dcId"
                  label="Delivery Container"
                  component={SingleSelect}
                  suggestions={props.deliveryContainerCodes}
                  value={dcId}
                  error={touched.dcId && Boolean(errors.dcId)}
                  helperText={touched.dcId ? errors.dcId : ''}
                  disabled={props.editDisabled}
                />
              </Grid>
              <Grid item xs={12}>
                <Field
                  name="groupId"
                  label="Group Diet"
                  component={SingleSelect}
                  suggestions={props.groupDietCodes}
                  value={groupId}
                  error={touched.groupId && Boolean(errors.groupId)}
                  helperText={touched.groupId ? errors.groupId : ''}
                  disabled={props.editDisabled}
                />
              </Grid>
            </Grid>
          </Grid>
          {isSubmitting &&
            <Fragment>
              <br />
              <LinearProgress />
              <br />
            </Fragment>
          }
          <Grid item xs={12} sm={3} style={{ padding: '10px' }}>
            <Button
              type="submit"
              fullWidth
              variant="contained"
              color="primary"
              disabled={!isValid}
            >
              {props.submitButtonText}
            </Button>
          </Grid>
          {/* <DisplayFormikState {...debug} /> */}
        </form>
      );
    };
    
    Form.propTypes = {
      values: PropTypes.shape({
        speciesId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
        current: PropTypes.bool.isRequired,
        tableId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
        noteId: PropTypes.string,
        label: PropTypes.bool.isRequired,
        dcId: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
        ncPrepares: PropTypes.bool.isRequired,
        groupId: PropTypes.string.isRequired,
        analyzed: PropTypes.bool.isRequired,
      }),
      errors: PropTypes.object.isRequired,
      touched: PropTypes.object.isRequired,
      handleChange: PropTypes.func.isRequired,
      isValid: PropTypes.bool.isRequired,
      setFieldTouched: PropTypes.func.isRequired,
      handleSubmit: PropTypes.func.isRequired,
      speciesCodes: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string,
        value: PropTypes.number,
      })).isRequired,
      tableCodes: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string,
        value: PropTypes.number,
      })).isRequired,
      deliveryContainerCodes: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string,
        value: PropTypes.number,
      })).isRequired,
      groupDietCodes: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string,
        value: PropTypes.number,
      })).isRequired,
      isSubmitting: PropTypes.bool,
      submitButtonText: PropTypes.string,
      editDisabled: PropTypes.bool,
    };
    
    Form.defaultProps = {
      values: {
        speciesId: '',
        current: true,
        tableId: '',
        noteId: '',
        label: true,
        dcId: '',
        ncPrepares: true,
        groupId: '1',
        analyzed: false,
      },
      isSubmitting: false,
      submitButtonText: 'Submit',
      editDisabled: true,
    };
    
    class FormikSelect extends React.Component {
      handleChange = value => {
  • ¶

    this is going to call setFieldValue and manually update values.topcis

        this.props.onChange('topics', value);
      };
    
      handleBlur = () => {
  • ¶

    this is going to call setFieldTouched and manually update touched.topcis

        this.props.onBlur('topics', true);
      };
    
      render() {
        return (
          <div style={{ margin: '1rem 0' }}>
            {/* eslint-disable jsx-a11y/label-has-for */}
            <label htmlFor="color">{this.props.label}</label>
            <Select
              id={this.props.id}
              options={this.props.options}
              onChange={this.handleChange}
              onBlur={this.handleBlur}
              value={this.props.value}
            />
            {!!this.props.error &&
              this.props.touched && (
                <div style={{ color: 'red', marginTop: '.5rem' }}>{this.props.error}</div>
            )}
          </div>
        );
      }
    }
    
    FormikSelect.propTypes = {
      onChange: PropTypes.func.isRequired,
      onBlur: PropTypes.func.isRequired,
      error: PropTypes.string.isRequired,
      touched: PropTypes.bool.isRequired,
      label: PropTypes.string,
      id: PropTypes.string.isRequired,
      value: PropTypes.shape({
        label: PropTypes.string.isRequired,
        value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
      }).isRequired,
      options: PropTypes.arrayOf(PropTypes.shape({
        label: PropTypes.string.isRequired,
        value: PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired,
      })).isRequired,
    };
    
    FormikSelect.defaultProps = {
      label: '',
    };
    
    export default formikEnhancer(Form);